package zisu.qgs.lambda.lambda;

import java.text.DecimalFormat;
import java.util.function.Function;

/**
 * @Author: 蔡翔
 * @Date: 2019/10/2 15:50
 * @Version 1.0
 */

interface IMoneyFormat{
    String format(int i);
}

class MyMoney{
    private final int money;
    public MyMoney(int money){
        this.money = money;
    }

    public void printMoney(IMoneyFormat iMoneyFormat){
        System.out.println("我的存款是："+iMoneyFormat.format(this.money));
    }
    //Function<> 就是函数式接口。
    public void printMoneyNoInterface(Function<Integer,String> moneyFormat){
        System.out.println("我的存款是："+moneyFormat.apply(this.money));
    }
}
public class MoneyDemo {

    public static void main(String[] args) {
        MyMoney myMoney = new MyMoney(9999);
        //i->new DecimalFormat("#,###").format(i) 这一串就相当于 实现了IMoneyFormat 的 String format(int i);
        // 我们根本不用关心 实现了什么接口、接口名字叫什么，我们只关心输入是什么输出是什么。
        myMoney.printMoney(i->new DecimalFormat("#,###").format(i));
        //下面这种方式就不需要写接口了。
        Function<Integer, String> integerStringFunction = i -> new DecimalFormat("#,###").format(i);

        // 函数接口链式操作，下面参数中的s 是上面返回的流（结果流），这里是9999，注意并包括，“我的存款是：” 这些。
        // 目的：定义更少的接口，更加灵活的操作。
        myMoney.printMoneyNoInterface(integerStringFunction.andThen(s-> "人民币："+s));
    }
}
